package com.sikaryofficial.backend.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sikaryofficial.backend.domain.dto.req.prize.PrizeOwnerListReq;
import com.sikaryofficial.backend.domain.dto.req.prize.PrizeRedeemListReq;
import com.sikaryofficial.backend.domain.dto.resp.prize.PrizeRedeemDTO;
import com.sikaryofficial.backend.domain.entity.PrizeRedeem;
import com.sikaryofficial.backend.domain.vo.export.PrizeWinnerExportVO;

import java.util.List;
import java.util.Map;

/**
 * 奖品兑换Service接口
 *
 * @author qinjinyuan
 * @date 2024-07-15
 */
public interface IPrizeRedeemService extends IService<PrizeRedeem> {

    /**
     * 个人奖品列表 （兑奖和转盘聚合）
     *
     * @param customerPage
     * @param req
     * @return
     */
    IPage<PrizeRedeemDTO> ownerRedeemList(Page<PrizeRedeemDTO> customerPage, PrizeOwnerListReq req);

     int countActivityResult(Long userId);
     int countPrizeRedeem(Long userId);
    /**
     * 根据兑奖记录ID，获取兑奖信息
     *
     * @param prizeRedeemId
     * @return
     */
    PrizeRedeemDTO getOwnerRedeemDetail(Long prizeRedeemId);

    /**
     * 根据活动ID，获取用户中奖结果
     *
     * @param activityResultId
     * @return
     */
    PrizeRedeemDTO getOwnerRedeemDetailByResultId(Long activityResultId);



    IPage<PrizeRedeemDTO> prizeRedeemPageList(Page<PrizeRedeemDTO> customerPage, PrizeRedeemListReq req);

    /**
     * 兑奖记录
     *
     * @param prizeId  奖品ID
     * @param prizeNum 奖品数量
     * @return true or false
     */
    PrizeRedeem prizeRedeemSave(Long prizeId, Integer prizeNum, Long userAddressId, Integer prizeGrantStatus);

    /**
     * 奖品兑换记录
     *
     * @param prizeIds     礼品ID
     * @param businessType 业务类型
     * @return 统计集合
     */
    Map<Long, Integer> prizeRedeemCount(List<Long> prizeIds, Integer businessType);

    /**
     * 奖品兑换记录
     *
     * @param prizeId      礼品ID
     * @param businessType 业务类型
     * @return 统计集合
     */
    Map<Long, Integer> prizeRedeemSignCount(Long prizeId, Integer businessType);

	List<PrizeWinnerExportVO> prizeWinnerExport(Long prizeId);

	/**
	 * 每个用户每月最多兑换 3 次
	 *
	 * @param userId       用户ID
	 * @param monthlyTotal 限制总次数
	 * @return
	 */
	boolean canExchangeByUser(Long userId, int monthlyTotal);

	/**
	 * 每个礼品每月只能兑换 1 次
	 *
	 * @param userId        用户ID
	 * @param prizeId       礼品ID
	 * @param prizeLimitNum 礼品限制数量
	 * @return
	 */
	boolean canExchangeByPrize(Long userId, Long prizeId, int prizeLimitNum);

}
